package service

import (
	"errors"
	"strings"

	"gorm.io/gorm"
	"xdingtec.cn/xdkaika/app"
	"xdingtec.cn/xdkaika/app/http/api/validator/example"
	"xdingtec.cn/xdkaika/app/models"
	"xdingtec.cn/xdkaika/utils"
	"xdingtec.cn/xdkaika/utils/pagination"
)

type ExampleService struct {
}

// @author      mz100
// @description 模板例子 新增卡片
// @param
// @return
func (ExampleService) Create(m *models.ExampleModel) (*models.ExampleModel, error) {
	err := app.DB.Create(&m).Error
	if err != nil {
		return nil, err
	}
	return m, nil
}

// @author      mz100
// @description 模板例子 获取分页数据
// @param
// @return
func (ExampleService) GetPage(f *example.PageForm) (*pagination.JsonPage, error) {
	p := &pagination.JsonPage{
		Page: f.Page,
	}
	limit, offset := pagination.GetLimitOffset(f.Page)

	db := app.DB.Model(&models.ExampleModel{})
	if f.Customer != "" {
		db.Where("customer LIKE ?", "%"+f.Customer+"%")
	}
	if f.CreateByUserId > 0 {
		db.Where("create_by_user_id = ?", f.CreateByUserId)
	}
	err := db.Count(&p.Total).Error
	if err != nil {
		return nil, err
	}
	p.TotalPage = pagination.GetTotal(p.Total)
	var list []*models.ExampleModel
	err = db.Preload("CardTemplate").Order("id desc").Limit(limit).Offset(offset).Find(&list).Error
	if err != nil {
		return nil, err
	}
	p.List = list
	return p, nil
}

// @author      mz100
// @description 模板例子 标记卡片
// @param
// @return
func (ExampleService) Mark(f *example.MarkForm) (bool, error) {
	cm := &models.ExampleModel{}
	err := app.DB.Where("uuid = ?", f.UUID).First(&cm).Error
	if err != nil {
		return false, errors.New("卡片读取失败")
	}
	//获取并插入标志
	marks := utils.StringsToInts(strings.Split(f.Marks, ","))
	db := app.DB.Model(&models.CardMarkModel{})
	var check int64
	err = db.Where("card_id = ?", cm.ID).Where("numbers in ?", marks).Count(&check).Error
	if err != nil || check > 0 {
		return false, errors.New("卡位已经标注")
	}
	mArray := []models.CardMarkModel{}
	for _, mark := range marks {
		mArray = append(mArray, models.CardMarkModel{
			CardId:         cm.ID,
			Numbers:        mark,
			CreateByUserId: app.JWTClaims.UserId,
		})
	}
	//总数
	count := len(mArray)
	// 启动事务处理新增任务
	var txerr error
	tx := app.DB.Begin()
	// 事务结束
	defer func() {
		if txerr != nil {
			tx.Rollback()
		} else {
			tx.Commit()
		}
	}()
	txerr = tx.Model(&cm).Where("count >= mark_count + ?", count).
		Update("mark_count", gorm.Expr("mark_count + ?", count)).
		Error
	if txerr != nil {
		return false, txerr
	}
	txerr = tx.Create(&mArray).Error
	if txerr != nil {
		return false, txerr
	}
	return true, nil
}

// @time        2022/05/10
// @author      mz100
// @description 模板例子 获取卡片详情
// @param
// @return
func (ExampleService) GetDetail(f *example.DetailForm) (*models.ExampleModel, error) {
	m := &models.ExampleModel{}
	err := app.DB.Preload("CardTemplate").Preload("CardMarks").Where("uuid = ?", f.UUID).First(&m).Error
	if err != nil {
		return nil, errors.New("卡片读取失败")
	}
	return m, nil
}
